﻿#define _CRT_SECURE_NO_WARNINGS 1

#include <stdio.h>
#include <assert.h>
#include <string.h>
#include <stdlib.h>

//1、求字符串长度：
//1.1 - strlen
//
//2、长度不受限制的字符串函数：
//1.2 - strcpy
//
//1.3 - strcat
//
//1.4 - strcmp
//
//3、长度受限制的字符串函数：
//1.5 - strncpy
//
//1.6 - strncat
//
//1.7 - strncmp
//
//4、字符串查找：
//1.8 - strstr
//
//1.9 - strtok
//
//5、错误信息报告：
//1.10 - strerror
//
//6、内存操作函数：
//1.11 - memcpy
//
//1.12 - memmove
//
//1.13 - memset
//
//1.14 - memcmp

//1.1-size_t strlen ( const char * str );
//strlen 是求字符串长度的，求出的长度是不可能为负数的
//所以返回类型设置为size_t 也是合情合理的
//size_t my_strlen(const char* str)
//{
//	assert(str);
//	size_t size=0;
//	while (*str)
//	{
//		size++;
//		str++;
//	}
//	return size;
//}
//
//int main()
//{
//	const char* arr = "abcdef";
//	printf("%d \n", my_strlen(arr));
//	return 0;
//}


//1.2-char* strcpy(char * str1, const char * str2 );
//
//char* my_strcpy(char* str1, const char* str2)
//{
//	assert(str1);
//	assert(str2);
//
//	char* head = str1;
//	while (*str2)
//	{
//		*str1 = *str2;
//		str1++;
//		str2++;
//	}
//	*str1 = *str2;		//将'\0'赋值给str1
//	return head;
//}
//
//int main()
//{
//	char str1[20] = "xxxxxxxxxxxxxxxxxx";
//	const char* str2 = "hello word!";
//	//strcpy(str1, str2);
//	my_strcpy(str1, str2);
//	printf("%s", str1);
//	return 0;
//}

//1.3-char* strcat(char* str1, const char* str2);

//char* my_strcat(char* str1, const char* str2)
//{
//	assert(str1);
//	assert(str2);
//
//	char* head = str1;
//	while (*str1)
//	{
//		str1++;
//	}
//	while (*str2)
//	{
//		*str1 = *str2;
//		str1++;
//		str2++;
//	}
//	
//	return head;
//}
//
//int main()
//{
//	char str1[20] = "hello ";
//	const char* str2 = "word!";
//	my_strcat(str1, str2);
//	//strcat(str1, str2);
//	printf("%s", str1);
//	return 0;
//}

//1.4-int strcmp(const char* str1, const char* str2);
//
//int my_strcmp(const char* str1, const char* str2)
//{
//	assert(str1);
//	assert(str2);
//
//	while (*str1 || *str2)
//	{
//		if (*str1 > *str2)
//		{
//			return 1;
//		}
//		if (*str1 < *str2)
//		{
//			return -1;
//		}
//		str1++;
//		str2++;
//	}
//	return 0;
//}
//
//int main()
//{
//	char str1[20] = "hellow";
//	const char* str2 = "hello";
//	int ret=my_strcmp(str1, str2);
//	printf("%d", ret);
//	return 0;
//}

//1.5-char * strncpy ( char * str1, const char * str2, size_t num );

//char* my_strncpy(char* str1, const char* str2, size_t num)
//{
//	assert(str1);
//	assert(str2);
//
//	char* head = str1;
//	while (num--)
//	{
//		*str1++ = *str2++;
//		if (*str2 == '\0')
//			break;
//	}
//	//判断字符串str2的长度是否小于num
//	if (num == -1)
//	{
//		return head;
//	}
//	//若字符串str2的长度小于num，则拷贝完字符串str2之后。
//	//在目标的后边追加 0 ，直到 num 个。
//	while (num--)
//	{
//		*str1++ = '\0';
//	}
//
//	return head;
//}
//
//int main()
//{
//	char str1[20] = "xxxxxxxxxxxxxxxx";
//	const char* str2 = "world!";
//	//strncpy(str1, str2, 6);
//	my_strncpy(str1, str2, 3);
//	printf("%s", str1);
//	return 0;
//}

//1.6-char * strncat ( char * str1, const char * str2, size_t num );
//
//char* my_strncat(char* str1, const char* str2, size_t num)
//{
//	assert(str1);
//	assert(str2);
//
//	char* head = str1;
//	while (*str1)
//	{
//		str1++;
//	}
//
//	while (num--)
//	{
//		*str1++ = *str2++;
//	}
//
//	return head;
//}
//
//int main()
//{
//	char str1[20] = "hello ";
//	const char* str2 = "world! hahaha";
//	//strncat(str1, str2, 3);
//	my_strncat(str1, str2, 10);
//	printf("%s", str1);
//	return 0;
//}

//1.7-int strncmp ( const char * str1, const char * str2, size_t num );
//
//int my_strncmp(const char* str1, const char* str2, size_t num)
//{
//	assert(str1);
//	assert(str2);
//
//	while ((*str1 || *str2) && num--)
//	{
//		if (*str1 > *str2)
//		{
//			return 1;
//		}
//		if (*str1 < *str2)
//		{
//			return -1;
//		}
//		str1++;
//		str2++;
//	}
//
//	return 0;
//}
//
//int main()
//{
//	char str1[20] = "hello";
//	const char* str2 = "helwo";
//	//int ret=strncmp(str1, str2, 4);
//	int ret = my_strncmp(str1, str2, 3);
//	printf("%d", ret);
//	return 0;
//}

//1.8-char * strstr ( const char *str1, const char * str2);
//
//char* my_strstr(const char* str1, const char* str2)
//{
//	assert(str1);
//	assert(str2);
//	
//	char* cur = str1;
//	char* head = str2;
//	while (*str1)
//	{
//		//判断首字符是否相等
//		if (*cur==*str2)
//		{
//			//遍历一遍str2若到结束时与字符串cur存在不相等时
//			//则需将str2重新归回字符串str2首位置便于下一次判断
//			while (*str2)
//			{
//				if (*str2 == *cur)
//				{
//					str2++;
//					cur++;
//				}
//				else
//				{
//					str2 = head;
//					break;
//				}
//			}
//			//若遍历str2一遍后str2没有归回字符串str2首位置
//			//则说明此时的str1的位置为字符串str2在字符串str1中的第一次出现的位置
//			if (str2 != head)
//			{
//				return str1;
//			}
//		}
//		//本次循环没有出现str2时cur指向str1下一个位置str1+1.
//		cur = ++str1;
//	}
//	return NULL;
//}
//
//int main()
//{
//	char str1[20] = "abbbcdef";
//	const char* str2 = "bcd";
//	//char* p=strstr(str1, str2);
//	char* p = my_strstr(str1, str2);
//	printf("%s",p);
//	return 0;
//}

//1.9-char * strtok ( char * str, const char * sep );

//int main()
//{
//	char str1[20] = "qq@1786217821.com";
//	const char*p = "@.";
//	char buf[20] = { 0 };
//	strcpy(buf, str1);
//	//分隔为：
//	//qq
//	//1786217821
//	//com
//	char* s = strtok(buf, p);
//	printf("%s",s);		//qq
//	printf("\n");
//	s = strtok(NULL, p);
//	printf("%s", s);		//1786217821
//	printf("\n");
//	s = strtok(NULL, p);
//	printf("%s", s);		//com
//
//	return 0;
//}

//1.10-char * strerror ( int errnum );

//int main()
//{
//	printf("%s\n", strerror(0));
//	printf("%s\n", strerror(1));
//	printf("%s\n", strerror(2));
//	printf("%s\n", strerror(3));
//	printf("%s\n", strerror(4));
//	printf("%s\n", strerror(5));
//
//	return 0;
//}

//1.11-void * memcpy ( void * str1, const void * str2, size_t num );
//
//void* my_memcpy(void* str1, const void* str2, size_t num)
//{
//	assert(str1);
//	assert(str2);
//
//	void* head = str1;
//	while (num--)
//	{
//		*(char*)str1 = *(char*)str2;
//		str1 = (char*)str1 + 1;
//		str2 = (char*)str2 + 1;
//	}
//	return head;
//}
//
//int main()
//{
//	int str1[10] = { 1,2,3,4,5,6,7,8,9,10 };
//	//const int str2[10] = {1,2,3,4,5,6};
//	memcpy(str1, str1+4,16);
//	//my_memcpy(str1, str2, 13);
//	for(int i=0;i<10;i++)
//	{
//		printf("%d\n", str1[i]);
//	}
//	return 0;
//}

//1.12-void * memmove ( void * str1, const void * str2, size_t num );
//
//void* my_memmove(void* str1, const void* str2, size_t num)
//{
//	assert(str1);
//	assert(str2);
//
//	void* ret = str1;
//	if (str1 < str2)
//	{
//		//前-->后
//		while (num--)
//		{
//			*(char*)str1 = *(char*)str2;
//			str1 = (char*)str1 + 1;
//			str2 = (char*)str2 + 1;
//		}
//	}
//	else
//	{
//		//后->前
//		while (num--)
//		{
//			*((char*)str1 + num) = *((char*)str2 + num);
//		}
//	}
//
//	return ret;
//}
//
//int main()
//{
//	int str1[10] = { 1,2,3,4,5,6 ,7,8,9,10};
//	//const int str2[10] = {1,2,3,4,5,6};
//	//memmove(str1, str2, 16);
//	my_memmove(str1, str1+4, 16);
//	for(int i=0;i<10;i++)
//	{
//		printf("%d\n", str1[i]);
//	}
//
//	return 0;
//}

//1.13-void *memset( void *str, int c, size_t count );

//int main()
//{
//	char str[20] = "abcdefghijk";
//	//memset(str, 'y', 5);
//	size_t num = 5;
//	w(str, 'y', num);
//	printf("%s", str);
//	return 0;
//}


//1.14-int memcmp ( const void * str1, const void * str2, size_t num );
//
//int my_memcmp(const void* str1, const void* str2, size_t num)
//{
//	assert(str1);
//	assert(str2);
//
//	char* cur1 = (char*)str1;
//	char* cur2 = (char*)str2;
//	while (num--)
//	{
//		if (*cur1 > *cur2)
//		{
//			return 1;
//		}
//		if (*cur1 < *cur2)
//		{
//			return -1;
//		}
//		str1 = (char*)str1 + 1;
//		str2 = (char*)str2 + 1;
//		cur1 = (char*)str1;
//		cur2 = (char*)str2;
//		return 0;
//	}
//}
//
//int main()
//{
//	int str1[10] = { 9,8,7,6,5,4,3,2,1};
//	int str2[10] = { 10,8,7,6,6,6,6,6,6};
//	//int ret = memcmp(str1, str2,20);
//	int ret = my_memcmp(str1, str2, 40);
//	printf("%d", ret);
//	return 0;
//}